package com.kingwang.training.designpattern.lod.bo.wrong;

/**
 * 收银员
 */
public class Cashier {
    /**
     * 收费
     *
     * @param myCustomer
     * @param payment
     */
    public void charge(Customer myCustomer, double payment) {
        // “把钱包交出来！”收银员算出顾客要买的商品总价后，“温柔”地对顾客说道。
        // 顾客言听计从，赶紧将钱包掏出来，恭恭敬敬地递给收银员。
        // 接过钱包，收银员毫不客气地打开，检查里面的钱够不够。噢，不错，钱够了。收银员从钱包取出钱，心满意足地笑了。
        //
        // 如果你是顾客，你敢去这样的超市shopping吗？
        Wallet wallet = myCustomer.getWallet();
        if (wallet.getMoney() > payment) {
            wallet.subtractMoney(payment);
        } else {
            // 钱不够
        }

        // 火车残骸
        // 形如：obj.method1().method2().method3()且每个方法返回结果不是同一个对象的情形
        //
        // 链式编程：obj.中间方法1().中间方法2().中间方法3().终结方法()
        //
        // 火车残骸与链式编程的区别：
        // 在链式编程中，除最后的终结方法外，所有中间方法返回的是对象[obj]自身，这些中间方法并没有违反LoD
        // 而终结方法执行完成后，相当于一个普通的方法调用，即相当于：终结方法(obj.中间方法1().中间方法2().中间方法3())
        // 而所有的中间方法返回的是[obj]自身，代码可以简化为：终结方法(obj)
    }
}
